[AWS CDK] 地味にめんどくさいAWSリソースの命名をロジック化してみた
下記のようにAWSリソースの命名規則を決めておくと、管理が楽になると思います。
……ですが、CloudFormationやAWS SAMを使って書くと、まぁ、地味にめんどくさいです(個人の感想です)
そこで、AWS CDKのメリットであるコードで書けるを活用して、AWSリソースの命名ロジックを作ってみました。
目次
環境
項目 | バージョン |
---|---|
macOS | Mojave 10.14.6 |
AWS CDK | 1.7.0 (build 8870695) |
node | v10.16.1 |
npm | 6.9.0 |
全体図
WebAPIを2つ、Lambdaを2つ、DynamoDBを1つ作ります。
※Lambdaコードは省略します。DynamoDBは作るだけです。
AWS CDKプロジェクトの構築
$ mkdir AWSCDK-ResourceNameSample $ cd AWSCDK-ResourceNameSample $ cdk init app --language=typescript
必要なライブラリをインストールします。
$ npm install --save @aws-cdk/aws-apigateway $ npm install --save @aws-cdk/aws-lambda $ npm install --save @aws-cdk/aws-dynamodb
リソース名を決めるロジックを作成する
やりたかったのはこれですね。AWSリソース名の作成ロジックを行うファイルを作成します。
$ touch lib/resourceName.ts
続いてコードを下記にします。やってることは単純ですね。
これを用いれば、
- SystemName: AWS-CDK-Resource-Sample
- SystemEnv: dev
としたとき、次のような命名になります。
種類 | コード例 | リソース名(結果) |
---|---|---|
CloudFormation Stack | resourceName.stackName('App') | AWS-CDK-Resource-Sample-dev-App-stack |
API Gateway | resourceName.apiName('user') | AWS-CDK-Resource-Sample-dev-user-api |
Lambda | resourceName.lambdaName('create-user') | AWS-CDK-Resource-Sample-dev-create-user-function |
Lambda | resourceName.lambdaName('get-user') | AWS-CDK-Resource-Sample-dev-get-user-function |
DynamoDB | resourceName.dynamodbName('user') | AWS-CDK-Resource-Sample-dev-user-table |
AWS CDKで適当にWebAPIを作る
以下、やってみました。
Lambdaコードを書く!
まずはファイルを作ります。
$ mkdir -p src/lambda/ $ touch src/lambda/create_user.ts $ touch src/lambda/get_user.ts
続いてコードを下記にします。
インフラをコードで書く!!!
bin/awscdk-resource_name_sample.ts
を下記にします。ResourceName
クラスのインスタンスを作成し、Stack作成クラスに渡しています。
lib/awscdk-resource_name_sample-stack.ts
を下記にします。受け取ったResourceName
クラスを利用して、AWSリソース名を決定しています。
ビルドする
npm run build
デプロイする
開発環境としてデプロイする
SYSTEM_ENV=dev cdk deploy
スタック作成が完了すると、エンドポイント(WebAPIのアドレス)が表示されるので、メモしておきます。
Outputs: AWS-CDK-Resource-Sample-dev-App-stack.AWSCDKResourceSampledevuserapiEndpoint1111 = https://xxxx.execute-api.ap-northeast-1.amazonaws.com/prod/
本番環境としてデプロイする
SYSTEM_ENV=prod cdk deploy
スタック作成が完了すると、エンドポイント(WebAPIのアドレス)が表示されるので、メモしておきます。
Outputs: AWS-CDK-Resource-Sample-prod-App-stack.AWSCDKResourceSampleproduserapiEndpoint2222 = https://yyyy.execute-api.ap-northeast-1.amazonaws.com/prod/
動作確認
開発環境
開発環境にデプロイした際のエンドポイントを叩きます。
$ curl -X POST https://xxxx.execute-api.ap-northeast-1.amazonaws.com/prod/user/1234 {"env":"dev","message":"create user id: 1234"} $ curl -X GET https://xxxx.execute-api.ap-northeast-1.amazonaws.com/prod/user/1234 {"env":"dev","message":"get user id: 1234"}
開発環境のLambdaが動いています!
本番環境
本番環境にデプロイした際のエンドポイントを叩きます。
$ curl -X POST https://yyyy.execute-api.ap-northeast-1.amazonaws.com/prod/user/1234 {"env":"prod","message":"create user id: 1234"} $ curl -X GET https://yyyy.execute-api.ap-northeast-1.amazonaws.com/prod/user/1234 {"env":"prod","message":"get user id: 1234"}
本番環境のLambdaが動いています!
AWSの様子
ブラウザでログインして、それぞれの様子を確認しました。バッチリです!
CloudFormation
API Gateway
Lambda
DynamoDB
さいごに
「コードでAWSインフラが書ける」というメリットをもっと活かしてみたいです。書いてて楽しいですね!!